import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
     
     
    public class DBlist {
            private ArrayList<DBServer> servers;
           
            public DBlist() {
                    servers = new ArrayList<DBServer>();
            }
           
            private class DBServer {
                    private int ID;
                    private Serwer serwer;
                    private int obciazenie;                 // moze tu zapisywac obciazenie?
                   
                    DBServer(int id, Socket s) {
                            ID = id;
                            serwer = new Serwer(s);
                    }
                    public int getId()
                    {
                            return ID ;
                    }
                    public int getObciazenie()
                    {
                            return obciazenie ;
                    }
                    public void setId(int i)
                    {
                            ID = i ;
                    }
                    public void setObciazenie(int ob)
                    {
                            obciazenie = ob ;
                    }
                    public Serwer getSerwer()
                    {
                    	return serwer ;
                    }
            }
           
            public void setObciazenie(int key, int ob)
            {
                    Iterator<DBServer> it = servers.iterator() ;
                    DBServer s ;
                    while(it.hasNext())
                    {
                            s = it.next();
                            if(s.getId() == key )
                                    s.setObciazenie(ob) ;
                    }
            }
            public int getObciazenie(int key)
            {
                    Iterator<DBServer> it = servers.iterator() ;
                    DBServer s ;
                    while(it.hasNext())
                    {
                            s = it.next();
                            if(s.getId() == key )
                                    return s.getObciazenie() ;
                    }
                    return -1 ;//nie ma serwera na liscie aktywnych
            }
           
            public void addServer(int id, Socket s) {
                    System.out.println("new DB added; new connection opened");
                    servers.add(new DBServer(id,s));
            }
            
            public void eraseServer(int id)
            {
            	Iterator<DBServer> it = servers.iterator() ;
            	DBServer a ;
            	while(it.hasNext())
            	{
            		a = it.next() ;
            		
            		if(a.getId() == id)
            		{
            			Message m = new Message() ;
            			m.setCommand("END_WRITER") ;
            			a.getSerwer().addMessage(m) ; //pusta wiadomosc zeby zamknac watek pisarza
            			it.remove() ;//usuniecie z listy aktywnych serwerow
            			break ;
            		}
            	}
            }
           
            public void sendMessage(int id, Message m) {
                    int index = isPresent(id);
                    if(index!=-1) servers.get(index).serwer.addMessage(m);
            }
           
           public LinkedList<Integer> lista()
			{
			Collections.sort(servers, new Comparator<DBServer>() {
			    public int compare(DBServer a, DBServer b) {
			        return Integer.signum(a.getObciazenie()-b.getObciazenie());
			    }}) ;
			
			
			LinkedList<Integer> l = new LinkedList<Integer>() ;
			Iterator<DBServer> it = servers.iterator() ;
			while(it.hasNext())
			{
				System.out.println("OBCIAZENIE : "+it.next().getObciazenie()) ;
			}
			it = servers.iterator();
			for(int i = 0 ; i < 3 ; ++i)
			{
				if(it.hasNext())
					l.add(it.next().getId()) ;
			}
			return  l ;
		}
           
            public int isPresent(int id) {
                    for(int i = 0; i<servers.size(); i++) {
                            if(id == servers.get(i).ID) return i;
                    }
                    return -1;
            }
           
           
    }

